package br.com.sig.financeiro.despesa.business.model.bo;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.enterprise.event.Observes;
import javax.inject.Named;

import org.joda.time.LocalDate;

import br.com.sig.business.exception.BaseException;
import br.com.sig.business.model.BaseService;
import br.com.sig.cadastro.fretista.business.model.enumeration.TipoDePagamento;
import br.com.sig.financeiro.despesa.business.event.PagarDespesaEvent;
import br.com.sig.financeiro.despesa.business.model.entity.Despesa;
import br.com.sig.financeiro.despesa.business.model.entity.DespesaFlutuante;
import br.com.sig.financeiro.despesa.business.model.enumeration.TipoDeDespesa;
import br.com.sig.financeiro.despesa.business.model.enumeration.TipoDeDespesaFlutuante;
import br.com.sig.financeiro.frete.business.event.ContabilizarFreteEvent;

@Named
@Stateless
public class DespesaBO extends BaseService<Despesa> {

	private static final long serialVersionUID = 6184500731159769115L;
	
	public void contabilizar(@Observes ContabilizarFreteEvent event) throws BaseException {

		String descricao = event.getFrete().getFretista().getPessoaFisica().getNome() + ", ";
		descricao += event.getFrete().getLocacao().getCliente().getPessoa().getNome() + " ";
		descricao += "(" + event.getFrete().getTipo() +") - ";
		descricao += new SimpleDateFormat("dd/MM/yyyy").format(event.getFrete().getLocacao().getDataDeInicio());
		
		DespesaFlutuante despesa = new DespesaFlutuante();
		despesa.setDescricao(descricao);
		despesa.setFormaDePagamento(event.getFrete().getFretista().getFormaDePagamento());
		despesa.setTipo(TipoDeDespesa.FLUTUANTE);
		despesa.setTipoDeDespesaFlutuante(TipoDeDespesaFlutuante.FRETE);
		despesa.setValor(event.getFrete().getValorPago());
		
		if (event.getFrete().getFretista().getTipoDePagamento().equals(TipoDePagamento.NO_ATO)) {
			despesa.setVencimento(event.getFrete().getData());
		} else if (event.getFrete().getFretista().getTipoDePagamento().equals(TipoDePagamento.NA_SEMANA)) {
			LocalDate vencimento = new LocalDate(event.getFrete().getData().getTime());
			vencimento.plusDays(7);
			despesa.setVencimento(vencimento.toDate());
		} else {//NA_QUINZENA
			
			Date vencimento = null;
			LocalDate dataDoFrete = new LocalDate(event.getFrete().getData().getTime());
			LocalDate primeiraQuinzena = dataDoFrete.withDayOfMonth(15);
			LocalDate segundaQuinzena = dataDoFrete.dayOfMonth().withMaximumValue();		
			
			if (dataDoFrete.isBefore(primeiraQuinzena)) {
				vencimento = primeiraQuinzena.toDate();
			} else if (dataDoFrete.equals(segundaQuinzena)) {
				LocalDate proximaQuinzena = dataDoFrete.plusDays(15);
				vencimento = proximaQuinzena.toDate();
			} else {
				vencimento = segundaQuinzena.toDate();			
			}
			
			despesa.setVencimento(vencimento);
		}
		
		persist(despesa);
	}
	
	public void pagar(@Observes PagarDespesaEvent event) throws BaseException {
		Date dataDePagamento = event.getDataDePagamento();
		List<Despesa> despesasAPagar = event.getDespesas();
		
		for (Despesa despesa : despesasAPagar) {
			despesa.setDataDePagamento(dataDePagamento);
			update(despesa);
		}
	}	
	
}